extends CharacterBody3D


const SPEED = 5.0
const JUMP_VELOCITY = 4.5


func _physics_process(delta: float) -> void:
	# Add the gravity.
	if not is_on_floor():
		velocity += get_gravity() * delta

	# Handle jump.
	if Input.is_action_just_pressed("jump") and is_on_floor():
		velocity.y = JUMP_VELOCITY

	# Get the input direction and handle the movement/deceleration.
	# As good practice, you should replace UI actions with custom gameplay actions.
	var input_dir := Input.get_vector("move_left", "move_right", "move_up", "move_down")
	if input_dir != Vector2.ZERO:
		print(transform.basis)
	var direction := (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
	if direction:
		velocity.x = direction.x * SPEED
		velocity.z = direction.z * SPEED
	else:
		velocity.x = move_toward(velocity.x, 0, SPEED)
		velocity.z = move_toward(velocity.z, 0, SPEED)

	move_and_slide()

@export var look_speed: float = 0.5

func _unhandled_input(event: InputEvent) -> void:
	if event is InputEventMouseMotion:
		rotate_look($".", event.relative)

func rotate_look(node: Node3D, relative: Vector2) -> void:
	# 上下旋转, 限制上下旋转的角度
	node.rotation_degrees.x -= relative.y * look_speed
	node.rotation_degrees.x = clamp(node.rotation_degrees.x, -45, 30)

	# 左右旋转，环绕
	node.rotation_degrees.y -= relative.x * look_speed
	node.rotation_degrees.y = wrapf(node.rotation_degrees.y, 0, 360.0)
